import Md5 from 'crypto-js/md5';
import axios from './ajax';
function getLoginInfo ({ success, fail }) {
  window.onUxLoginInfo = (loginInfo) => {
    /*
    * {access_token,token_type,refresh_token,userinfo:{}}
    * */
    success(loginInfo ? JSON.parse(loginInfo) : {
      token_type: '',
      access_token: ''
    });
  };
  window.UxinJsCore.postMessage(JSON.stringify({
    method: 'getLoginInfo',
    params: {}
  }));
}
function getYouXinUserInfo () {
  return new Promise((resolve, reject) => {
    getLoginInfo({
      success (loginInfo) {
        // json对象 {access_token,token_type,refresh_token,userinfo:{}}
        // 用户账号：userinfo.bizUsername
        const { userinfo } = typeof loginInfo === 'string' ? JSON.parse(loginInfo) : loginInfo;
        if (!userinfo.bizUsername) {
          // 注意大小写
          userinfo.bizUsername = loginInfo.bizUserName;
        }
        resolve(userinfo);
      },
      fail (err) {
        reject(err);
      }
    });
  });
}
/**
 * @method uuID
 * @description 生成唯一标识字符串
 * @author yanghaiyang
 * @date 2021-07-23 14:40
 * @returns {String} uuid
 */
 export function uuID () {
  let d = new Date().getTime();
  const uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
    const r = (d + Math.random() * 16) % 16 | 0;
    d = Math.floor(d / 16);
    return (c === 'x' ? r : (r & 0x3) | 0x8).toString(16);
  });
  return uuid;
}
function getTokenParams () {
    return new Promise((resolve, reject) => {
      const isInYouXin = !!window.UxinJsCore;
      if (isInYouXin) {
        getYouXinUserInfo().then(userinfo => {
          // a	要操作的用户账号
          // ut	账号类型	2-教师 4-学生
          // ac	账号区域	如：1.1.1
          resolve({
            ut: userinfo.usertype,
            a: userinfo.bizUsername,
            ac: userinfo.areaId
          });
        }, () => {
          reject(new Error('获取token信息失败'));
        });
      } else {
        const auth_token_str = localStorage.getItem('auth_token');
        if (auth_token_str) {
          const auth_token = JSON.parse(decodeURIComponent(auth_token_str)), { userinfo } = auth_token;
          resolve({
            ut: userinfo.usertype,
            a: userinfo.bizUsername,
            ac: userinfo.areaId
          });
        } else {
          reject(new Error('获取token信息失败'));
        }
      }
    });
  }
/**
 * @method updateUCoins
 * @description 更新账户U币
 * @author yanghaiyang
 * @date 2021-07-26 17:07:00
 * @param {String} [at]	操作类型	u（代表积分）、z（代表直接扣除或者增加多少积分） 默认为 'u', 只按照规则code来执行
 * @param {String} [c]	动作编码	积分的规则编码，参照表
 * @param {Number} [n]	操作数量	操作类型为 u 时，传固定值 1；操作类型为 z 时，代表直接操作的积分数量
 * @param {String} [r]	关联数据	关联业务数据 id(比如试卷、视频id)，建议加上系统前缀，避免重复，如：1_10000（找长安）
 * @param {Number} [s]	关联系统	1-口算 2-生字 3-互动微课 4-题库 5-资源应用
 * @param {String} [i]	操作详细说明	中文需要urlencode，为utf8编码, 调用方传入一段说明性文字
 */
 export const UpdateUCoins = async function ({ at = 'u', c, n, r, s, i }, devUrl = '') {
    try {
      const tokenParams = await getTokenParams(),
        params = {
          ...tokenParams,
          // 操作唯一id	标识一次请求
          ad: uuID(),
          at,
          c,
          n: at === 'u' ? 1 : n,
          r: s + '_' + r,
          s,
          i: encodeURIComponent(i)
        },
        p = JSON.stringify(params),
        random = Md5(tokenParams.a + tokenParams.ac + c).toString(),
        // 开发时最好写一下域名http://cs.yjt361.com，配置一下浏览器跨域访问，方便开发
        // 如果业务项目中开发的时候没有传入devUrl 需要在 devServer 配置代理 /ub/ 代理指向http://cs.yjt361.com
        url = (devUrl || window.location.origin) + '/ub/interface/data_report.jsp';
        return axios(url, 'POST', { p, random });
    } catch (e) {
      return new Promise((resolve, reject) => {
        resolve();
      });
    }
  };
